/*
 * Copyright (c) 2011, Yawning <yawninglol at gmail.com>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   * Neither the name of the Mew Developers nor the
 *     names of its contributors may be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

package yawning.mew.protwarrior;

import yawning.mew.character.StatLogic;

public class ProtWarriorStatLogic {
	// Values taken from: http://www.tankspot.com/showthread.php?71168-4.0.1-Threat-Values-for-Warriors
	// Updates noted where relevant, unless noted otherwise, the stance multiplier applies.

	// TODO: Move these into statlogic.xml

	// BShout/CShout: (ShoutThreat * stanceMult + RageGainThreat * rageGained) / nrTargets
	private int mBattleShoutThreat = 20;
	private int mCommandingShoutThreat = 68;
	private int mRageGainThreat = 5;

	// Cleave: BaseDmg + AP * Coeff
	// (Dmg + (Threat / nrTargets)) * stanceMult
	private int mCleaveBaseDamage = 6;
	private double mCleaveCoeff = 0.45;
	private int mCleaveThreat = 30;	// Split

	// Concussion Blow: AP * Coeff
	private double mConcussionBlowCoeff = 0.75;
	private double mConcussionBlowThreatMult = 2;

	// Demoralizing Shout: ShoutThreat * stanceMult / nrTargets
	private double mDemoralizingShoutThreat = 41.6;

	// Devastate: WeaponDmg * DevastateMult + DevastateBonusDamage
	// NB: Weapon Damage is normalized.
	private double mDevastateMult = 1.5;
	private int mDevastateBonusDamage = 854;

	// Bastion of Defense (proc)
	private int mBastionOfDefenseThreat = 1;

	// Rude Interruption (proc) XXX: Assumed since Bastion of Defense also has threat
	private int mRudeInterruptionThreat = 1;

	// Heroic Strike: BaseDmg + AP * Coeff
	// (Dmg + Threat) * stanceMult
	private int mHeroicStrikeBaseDamage = 8;
	private double mHeroicStrikeCoeff = 0.6;
	private int mHeroicStrikeThreat = 28;

	// Heroic Throw: BaseDmg + AP * Coeff
	// (Dmg * ThreatMult) * stanceMult
	private int mHeroicThrowBaseDamage = 12;
	private double mHeroicThrowCoeff = 0.5;
	private double mHeroicThrowThreatMult = 1.5;

	// Rend: 525 + (0.25 * 6 * ((MWB + mwb) / 2 + AP / 14 * MWS)) over 15 sec, 3 sec interval.
	private int mRendBaseDamage = 525 / 6;	// Per Tick
	private double mRendCoeff = 0.25; // Per Tick

	// Revenge: 1619 -> 1977 + AP * Coeff
	// (Dmg + Threat) * stanceMult
	private int mRevengeBaseDamage = (1619 + 1977) / 2;
	private double mRevengeCoeff = 0.31;
	private int mRevengeThreat = 7;

	// Shield Slam: BaseDmg + AP * Coeff
	// (Dmg + Threat) * stanceMult
	private int mShieldSlamBaseDamage = (1794 + 1884) / 2;
	private double mShieldSlamCoeff = 0.6;
	private int mShieldSlamThreat = 231;	// Is this correct?

	// Shockwave: AP * Coeff
	private double mShockwaveCoeff = 0.75;

	// Thunder Clap: Base Dmg + AP * Coeff
	private int mThunderClapBaseDamage = 302;
	private double mThunderClapCoeff = 0.12;

	// Victory Rush: AP * Coeff
	private double mVictoryRushCoeff = 0.56;

	public ProtWarriorStatLogic(StatLogic sl) {

	}

	public int getRageGainThreat() {
		return mRageGainThreat;
	}

	public int getBattleShoutThreat() {
		return mBattleShoutThreat;
	}

	public int getCommandingShoutThreat() {
		return mCommandingShoutThreat;
	}

	public double getDemoralizingShoutThreat() {
		return mDemoralizingShoutThreat;
	}

	public int getBastionOfDefenseThreat() {
		return mBastionOfDefenseThreat;
	}

	public int getRudeInterruptionThreat() {
		return mRudeInterruptionThreat;
	}

	public int getShieldSlamBaseDamage() {
		return mShieldSlamBaseDamage;
	}

	public double getShieldSlamCoeff() {
		return mShieldSlamCoeff;
	}

	public int getShieldSlamThreat() {
		return mShieldSlamThreat;
	}

	public double getDevastateMult() {
		return mDevastateMult;
	}

	public int getDevastateBonusDamage() {
		return mDevastateBonusDamage;
	}

	public int getRevengeBaseDamage() {
		return mRevengeBaseDamage;
	}

	public double getRevengeCoeff() {
		return mRevengeCoeff;
	}

	public int getRevengeThreat() {
		return mRevengeThreat;
	}

	public int getThunderClapBaseDamage() {
		return mThunderClapBaseDamage;
	}

	public double getThunderClapCoeff() {
		return mThunderClapCoeff;
	}

	public int getRendBaseDamage() {
		return mRendBaseDamage;
	}

	public double getRendCoeff() {
		return mRendCoeff;
	}

	public double getConcussionBlowCoeff() {
		return mConcussionBlowCoeff;
	}

	public double getConcussionBlowThreatMut() {
		return mConcussionBlowThreatMult;
	}

	public double getShockwaveCoeff() {
		return mShockwaveCoeff;
	}

	public int getHeroicStrikeBaseDamage() {
		return mHeroicStrikeBaseDamage;
	}

	public double getHeroicStrikeCoeff() {
		return mHeroicStrikeCoeff;
	}

	public int getHeroicStrikeThreat() {
		return mHeroicStrikeThreat;
	}

	public int getCleaveBaseDamage() {
		return mCleaveBaseDamage;
	}

	public double getCleaveCoeff() {
		return mCleaveCoeff;
	}

	public int getCleaveThreat() {
		return mCleaveThreat;
	}

	public int getHeroicThrowBaseDamage() {
		return mHeroicThrowBaseDamage;
	}

	public double getHeroicThrowCoeff() {
		return mHeroicThrowCoeff;
	}

	public double getHeroicThrowThreatMult() {
		return mHeroicThrowThreatMult;
	}

	public double getVictoryRushCoeff() {
		return mVictoryRushCoeff;
	}
}
